package cn.tedu.lock;

import java.util.concurrent.CyclicBarrier;

/*
    案例：跑步比赛
    运动员都到了起跑线之后，听到枪响，再跑出去
 */
public class CyclicBarrierDemo {

    public static void main(String[] args) {

        CyclicBarrier cb = new CyclicBarrier(6);
        new Thread(new Runner(cb), "1号").start();
        new Thread(new Runner(cb), "2号").start();
        new Thread(new Runner(cb), "3号").start();
        new Thread(new Runner(cb), "4号").start();
        new Thread(new Runner(cb), "5号").start();
        new Thread(new Runner(cb), "6号").start();

    }

}

class Runner implements Runnable {

    private final CyclicBarrier cb;

    public Runner(CyclicBarrier cb) {
        this.cb = cb;
    }

    @Override
    public void run() {
        try {
            // 模拟：运动员走到起跑线的时间
            Thread.sleep((long) (10000 * Math.random()));
            String name = Thread.currentThread().getName();
            System.out.println(name + "运动员走到了起跑线准备~~~");
            // 等所有的运动员都到了起跑线之后，听到枪响，才能往外跑
            // 在上述线程执行到同一个点之前，需要先陷入阻塞
            // 阻塞过程中，每执行一个线程，还需要减少计数
            // 阻塞，计数
            cb.await();
            System.out.println(name + "运动员跑了出去~~~");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
